#ifndef __IRC_H__
#define __IRC_H__

#ifdef __cplusplus
extern "C" {
#endif

#include "irc_internal.h"	// ユーザが認識しなくていい情報
/***********************************************************************
***********************************************************************/
#define IRC_DEBUG	(1) // 非デバッグ時は定義を消しておいてください
/***********************************************************************
***********************************************************************/
#ifdef IRC_DEBUG
#define PRINTF OS_Printf
#else
#define PRINTF TRUE ? (void)0 : OS_Printf
#endif
/***********************************************************************
***********************************************************************/
#define IRC_TRNS_MAX		(128+4)	// 一度に送れる転送バイト数(+4 はポケモン対策)

#define IRC_UNIT_DHC		(0x00)	// DHC
#define IRC_UNIT_IRC		(0x01)	// 赤外線通信カード
#define IRC_UNIT_PHC		(0x02)	// PHC
#define IRC_UNIT_UNKNOWN	(0xFF)	// 機器不明
/***********************************************************************
エラーコード
***********************************************************************/
  typedef enum{
	IRC_ERROR_NONE,				// エラーなし
	  //IRC_ERROR_NOTCONNECT,		// 接続中でない
	  IRC_ERROR_TIMEOUT,		// タイムアウトエラー
	  //IRC_ERROR_CHECKSUM,		// チェックサムエラー->リトライしてタイムアウトした時だけエラーを出す
	  IRC_ERROR_NUM
  }IRCError;
/***********************************************************************
コールバック関数の型定義
***********************************************************************/
  typedef void (*IRCConnectCallback)(u8 id, BOOL isSender);
  typedef void (*IRCRecvCallback)(u8 *data, u8 size, u8 command, u8 value);
  typedef void (*IRCShutdownCallback)(BOOL isError);
/***********************************************************************
***********************************************************************/
  extern void IRC_Init(void);		// 初期化関数
  extern IRCError IRC_Move(void);		// 毎フレーム呼ぶプロセス関数
  extern void IRC_Send(const u8 *buf, u8 size, u8 command, u8 value);	// データ送信

  extern void IRC_SetConnectCallback(IRCConnectCallback cb); // 接続コールバックの設定
  extern void IRC_SetRecvCallback(IRCRecvCallback cb); // データ受信コールバックの設定
  extern void IRC_SetShutdownCallback(IRCShutdownCallback cb); // データ受信コールバックの設定

  extern void IRC_Connect(void);	// 接続要求。こちらをした方(実際にはこの要求を受けた方の逆)がセンダになります。
  extern BOOL IRC_IsSender(void); // センダかどうかの確認(接続中のみ有効)

  extern BOOL IRC_IsConnect(void); // 接続の確認
  extern void IRC_Shutdown(void); // 切断

  extern BOOL IRC_Check(void);	// カードチェック(TRUE で新型IRC カード)
/***********************************************************************
動作には必須でないもの
***********************************************************************/
extern void IRC_SetUnitNumber(u8 id); // 自身のユニット番号を設定する
extern u8 IRC_GetUnitNumber(void); // 通信相手のユニット番号の確認(切断時は0xFF)

extern u32 IRC_GetRetryCount(void); // トータルのリトライ回数を取得する(デバッグ用)

/***********************************************************************
***********************************************************************/
#ifdef __cplusplus
} /* extern "C" */
#endif

#endif